//////////////////////////////////////////////////////////////////////////////////////////////////////
// 项目名   : Algorithm
// 文件名   : NumericalAlgorithm.h
// 作者     : Aiye
// 日期     : 2025/9/9 02:58
// 邮箱     : 2878548868@qq.com
// 摘要     : 介绍数值算法
//////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef ALGORITHM_NUMERICALALGORITHM_H
#define ALGORITHM_NUMERICALALGORITHM_H
#include <iostream>
#include <numeric>
#include <vector>

/**
 * @brief 数值算法
 */
class Numeric
{
public:
    /**
     * @brief 累加操作
     */
    static void Accumulator()
    {
        std::vector<int> nVec{1,2,3,4,5,6,7,8,9};
        auto nSum = std::accumulate(nVec.begin() , nVec.end() , 0); // 默认为加法
        std::cout << "Sum:" << nSum << std::endl;

        std::vector<std::string> strVec{{"Hello"} , {"World"} , {"C++"} , {"Hello"}};
        auto strSum = std::accumulate(strVec.begin() , strVec.end() , std::string());
        std::cout << "Sum:" << strSum << std::endl;

        nSum = std::accumulate(nVec.begin() , nVec.end() , 1 ,std::multiplies<>());
        std::cout << "Sum:" << nSum << std::endl;
    }

    /**
     * @brief 内积
     */
    static void InnerProduct()
    {
        std::vector<int> nVec1{1,2,3,4,5};
        std::vector<int> nVec2{6,7,8,9,10};

        auto nDot = std::inner_product(nVec1.begin() , nVec1.end() , nVec2.begin() , 0);
        std::cout << "Dot:" << nDot << std::endl;
        nDot = std::inner_product(nVec1.begin() , nVec1.end() ,nVec2.begin() , 0 ,std::minus<>() , std::plus<>());
        std::cout << "Dot:" << nDot << std::endl;
    }

};
#endif //ALGORITHM_NUMERICALALGORITHM_H